"use client"

import { useState, useCallback, useEffect } from "react"
import type { CartItem, Product } from "@/types"

export function useCart() {
  // 关键修改：使用函数从 localStorage 同步获取初始值
  const [items, setItems] = useState<CartItem[]>(() => {
    // 确保在客户端环境下执行
    if (typeof window !== 'undefined') {
      const savedCart = localStorage.getItem("cart")
      if (savedCart) {
        try {
          return JSON.parse(savedCart)
        } catch (error) {
          console.error("Failed to load cart from localStorage:", error)
          return [] // 解析失败时返回空数组
        }
      }
    }
    return [] // 默认情况返回空数组
  })

  // 保存购物车数据到 localStorage 的 useEffect 保持不变
  useEffect(() => {
    localStorage.setItem("cart", JSON.stringify(items))
  }, [items])

  // ... 其他函数 (addItem, updateQuantity, removeItem, clearCart) 保持不变 ...
  const addItem = useCallback((product: Product, quantity = 1) => {
    setItems((prev) => {
      const existingItem = prev.find((item) => item.id === product.id)
      if (existingItem) {
        return prev.map((item) => 
          item.id === product.id 
            ? { ...item, quantity: item.quantity + quantity } 
            : item
        )
      }
      return [...prev, { ...product, quantity }]
    })
  }, [])

// 1. 先定义 removeItem
const removeItem = useCallback((id: string) => {
  setItems((prev) => prev.filter((item) => item.id !== id))
}, [])

// 2. 再定义 updateQuantity，此时它可以安全地引用 removeItem
const updateQuantity = useCallback(
  (id: string, quantity: number) => {
    if (quantity <= 0) {
      removeItem(id) // ✅ 现在 removeItem 已声明
      return
    }
    setItems((prev) => prev.map((item) => (item.id === id ? { ...item, quantity } : item)))
  },
  [removeItem] // 确保依赖项正确
)


  const clearCart = useCallback(() => {
    setItems([])
  }, [])

  // 计算总价和商品数量
  const total = items.reduce((sum, item) => sum + item.price * item.quantity, 0)
  const itemCount = items.reduce((sum, item) => sum + item.quantity, 0)

  return {
    items,
    addItem,
    updateQuantity,
    removeItem,
    clearCart,
    total,
    itemCount,
  }
}